import { LngLatBounds } from '../../entity/lngLat'
import { Point } from '../../entity/point'

/**
 * 图层属性对象
 */
export interface TileLayerOptions {
    /**
     * 地图允许展示的最小级别
     *
     * 默认值为 `0`
     */
    minZoom?: number;

    /**
     * 地图允许展示的最大级别
     *
     * 默认值为 `18`
     */
    maxZoom?: number;

    /**
     * 当没有瓦片时所显示的错误图片地址
     *
     * 默认值为 `''`
     */
    errorTileUrl?: string;

    /**
     * 设置图层的透明度（`0.0-1.0`）
     *
     * 默认值为 `1.0` 不透明
     */
    opacity?: number;

    /**
     * 图层的显示顺序
     *
     * 默认值为 `null`
     */
    zIndex?: number;

    /**
     * 设置指定范围内显示瓦片
     *
     * 默认值为 `null`
     */
    bounds?: LngLatBounds
}

/**
 * 此接口定义了地图图块层的公共方法
 */
export interface TileLayerMethods {
    /**
     * 改变图层的透明度
     *
     * @param opacity 取值范围 `0-1` 之间
     */
    setOpacity: (opacity: number) => this;

    /**
     * 设置图层的叠放顺序
     *
     * @param zIndex 大于 `1` 的整数
     */
    setZIndex: (zIndex: number) => this;

    /**
     * 重新加载所有添加到此 `TileLayer` 的可见瓦片
     */
    refresh: () => this;

    /**
     * 更新图层的 `URL` 地址并重绘他们
     *
     * @param url 图层服务地址
     */
    setUrl: (url: string) => this;

    /**
     * 瓦片的标签容器
     */
    getContainer: () => HTMLElement
}

/**
 * 获取瓦片图层事件工厂对象
 */
export type GetTileLayerEventFactory<Target> = {
    /**
     * 当瓦片图层开始加载瓦片时触发
     */
    loading: (event: { type: 'loading', target: Target }) => void;

    /**
     * 当瓦片图层加载完可见瓦片后触发
     */
    load: (event: { type: 'load', target: Target }) => void;

    /**
     * 瓦片请求和开始加载时触发
     */
    tileloadstart: (event: { type: 'tileloadstart', target: Target, coords: Point, tile: HTMLElement }) => void;

    /**
     * 在加载瓦片时触发
     */
    tileload: (event: { type: 'tileload', target: Target, coords: Point, tile: HTMLElement }) => void;

    /**
     * 在瓦片被移除时触发（比如打开了 `unloadInvisibleTiles`）
     */
    tileunload: (event: { type: 'tileunload', target: Target, coords: Point, tile: HTMLElement }) => void;

    /**
     * 瓦片错误时触发
     */
    tileerror: (event: { type: 'tileerror', target: Target, coords: Point, tile: HTMLElement }) => void
}
